home *** CD-ROM | disk | FTP | other *** search
-
- package sub_arctic.constraints;
-
- import sub_arctic.lib.interactor;
- import sub_arctic.lib.interactor_consts;
- import sub_arctic.lib.manager;
- import sub_arctic.lib.sub_arctic_error;
-
- import java.util.Vector;
-
- /**
- * Constraint implementation class to provide encoding for standard 3 operand
- * constraints. This object takes 3 std_objpart_encoding objects representing
- * operands, along with an unsigned 8 bit value to provide a constant to the
- * function.<p>
- *
- * 3 operand constraints are encoded as:
- * <pre>
- * 8 6 6 6 5
- * KKKKKKKK AAAAAA BBBBBB CCCCCC X 00000
- * </pre>
- * where KKK represents an 8 bit unsigned constant, AAA, BBB, and CCC
- * represent parameter objects, and X represents one bit used to encode an
- * op code (i.e, clip or wrap in the standard set).<p>
- *
- * @author Scott Hudson
- */
-
- public class op3_impl implements std_encoding_consts {
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Create a standard constraint given an op_code, 3 obj/part designators,
- * and a constant.<p>
- *
- * @param int op_code op code value for this operation.
- * @param std_objpart_encoding op1 designator for operand 1
- * @param std_objpart_encoding op2 designator for operand 2
- * @param std_objpart_encoding op3 designator for operand 3
- * @param short K value for 15 bit signed constant
- */
- public static std_constraint create(
- int op_code,
- std_objpart_encoding op1,
- std_objpart_encoding op2,
- std_objpart_encoding op3,
- short K)
- {
- return new std_constraint(encode(op_code,op1,op2,op3,K),
- op1.orientation() | op2.orientation() | op3.orientation());
- }
-
- //had:
- //* @exception bad_constraint if the op code is out of range.
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Do an encoding given an op_code, 3 obj/part designators, and a constant.
- *
- * @param int op_code op code value for this operation.
- * @param std_objpart_encoding op1 designator for operand 1
- * @param std_objpart_encoding op2 designator for operand 2
- * @param std_objpart_encoding op3 designator for operand 3
- * @param short K value for 15 bit signed constant
- */
- public static int encode(int op_code,
- std_objpart_encoding op1,
- std_objpart_encoding op2,
- std_objpart_encoding op3,
- short K)
- {
- if (op_code < OP3_MIN || op_code > OP3_MAX)
- throw new sub_arctic_error(
- "Unrecognized op code (" + op_code + ") used for 3 op constraint");
-
- return (((int)K)<<24) | ((op1.encoding() & OBJPART_MASK) << 18) |
- ((op2.encoding() & OBJPART_MASK) << 12) |
- ((op3.encoding() & OBJPART_MASK) << 6) |
- ((op_code<<OP3_SHIFT) & OP3_MASK) | OP3_LOBITS;
- }
-
- //had:
- //* @exception bad_constraint if the op code is out of range.
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Decode op_code from the given encoding. We assume that this is already
- * known to be a 3-op constraint -- otherwise incorrect results will be
- * returned.<p>
- *
- * @param int enc the encoding for a constraint
- */
- public static int op_code(int enc) { return (enc & OP3_MASK) >> OP3_SHIFT; }
-
- /**
- * Decode first operand from the given encoding. We assume that this is
- * already known to be a 3-op constraint -- otherwise incorrect results
- * will be returned.<p>
- *
- * @param int enc the encoding for a constraint
- */
- public static int op1(int enc) { return (enc >> 18) & OBJPART_MASK; }
-
- /**
- * Decode second operand from the given encoding. We assume that this is
- * already known to be a 3-op constraint -- otherwise incorrect results
- * will be returned.<p>
- *
- * @param int enc the encoding for a constraint
- */
- public static int op2(int enc) { return (enc >> 12) & OBJPART_MASK; }
-
- /**
- * Decode third operand from the given encoding. We assume that this is
- * already known to be a 3-op constraint -- otherwise incorrect results
- * will be returned.<p>
- *
- * @param int enc the encoding for a constraint
- */
- public static int op3(int enc) { return (enc >> 6) & OBJPART_MASK; }
-
- /**
- * Decode constant from the given encoding. We assume that this is
- * already known to be a 3-op constraint -- otherwise incorrect results
- * will be returned.<p>
- *
- * @param int enc the encoding for a constraint
- */
- public static int const_val(int enc) { return (enc >> 24) & 0xff; }
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /* Part constants copied over from interactor_consts for convenience. */
- public static final int X = interactor_consts.X;
- public static final int Y = interactor_consts.Y;
- public static final int W = interactor_consts.W;
- public static final int H = interactor_consts.H;
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Evaluate an encoded constraint function given its operand and constant
- * values. We assume here that it is has already been determined that
- * the constraint is a 3-op constraint.<p>
- *
- * @param int enc the encoding from the constraint
- * @param interactor constr_obj the object being constrained
- * @param int val1 value of first operand
- * @param int val2 value of second operand
- * @param int val3 value of third operand
- * @param int cnst_val value of constant parameter
- * @param int orient orientation of the constraint (should be
- * HORIZONTAL or VERTICAL).
- * @return int the result of the evaluation
- */
- public static int eval_fun(
- int enc,
- interactor constr_obj,
- int val1,
- int val2,
- int val3,
- int cnst_val,
- int orient)
- {
- /* sanity check */
- if (constr_obj == null)
- throw new sub_arctic_error("Null constrained object passed to " +
- "op3_impl.eval_fun()");
-
- /* execute code for the encoded function */
- switch(op_code(enc))
- {
- case OP_clip: return 0; //xx later
- case OP_wrap: return 0; //xx later
-
- default:
- /* something is wrong if we get here */
- throw new sub_arctic_error("Improperly encoded constraint found in "+
- "op3_impl.eval_fun()");
- }
- }
-
- //had:
- //* @exception bad_value if the encoding, or constrained object/part are
- //* malformed
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Evaluate an encoded constraint applied to the given part of the given
- * object. We assume here that it it has already been determined that
- * the constraint is a 3-op constraint.<p>
- *
- * @param int enc the encoding from the constraint
- * @param interactor constr_obj the object being constrained
- * @param int constr_part the part being constrained
- * @param int orient the orientation of the constraint
- * @return int the result of the evaluation
- */
- public static int eval(
- int enc,
- interactor constr_obj,
- int constr_part,
- int orient)
- {
- int cnst_val, val1, val2, val3;
-
- /* sanity check */
- if (constr_obj == null)
- throw new sub_arctic_error("Null constrained object passed to " +
- "op1_impl.eval()");
-
- /* extract the constant */
- cnst_val = const_val(enc);
-
- /* get the value for the operands */
- val1 = std_constraint_impl.the_impl().fetch_value(
- op1(enc), constr_obj, orient);
- val2 = std_constraint_impl.the_impl().fetch_value(
- op2(enc), constr_obj, orient);
- val3 = std_constraint_impl.the_impl().fetch_value(
- op3(enc), constr_obj, orient);
-
- /* compute the value */
- return eval_fun(enc, constr_obj, val1, val2, val3, cnst_val, orient);
- }
-
- //had:
- //* @exception bad_value if the encoding, or constrained object/part are
- //* malformed
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /** Test whether the given encoded constraint (constraining the given
- * object) depends on the indicated object and part (expressed relative
- * to it). Here we assume that the encoding is already known to contain
- * a 3-op constraint.<p>
- *
- * @param int enc The encoding for the constraint.
- * @param interactor constr_obj The object the constraint is attached to
- * @param int test_which_obj The object we are asking about. This
- * can be one of the values OBJCODE_SELF,
- * OBJCODE_PARENT, OBJCODE_SOME_CHILD,
- * OBJCODE_PREV_SIBLING, or
- * OBJCODE_NEXT_SIBLING.
- * @param int test_which_part The part we are asking about.
- * @param int nth_child for SOME_CHILD, this provides the index
- * of the child (and is ignored otherwise).
- * @param int orient Orientation of the constraint. This
- * should be HORIZONTAL or VERTICAL.
- * @return boolean whether the given constraint depends upon the given value
- */
- public static boolean depends_on(
- int enc,
- interactor constr_obj,
- int which_obj,
- int which_part,
- int nth_child,
- int orient)
- {
- int op;
-
- /* no special case implicit operands */
-
- /* have a look at the first operand dependency */
- op = op1(enc);
- if (std_constraint_impl.the_impl().part_depends_on(op, constr_obj,
- which_obj, which_part, nth_child, orient))
- return true;
-
- /* if that didn't match try the second operand */
- op = op2(enc);
- if (std_constraint_impl.the_impl().part_depends_on(op, constr_obj,
- which_obj, which_part, nth_child, orient))
- return true;
-
- /* finally, try the 3rd */
- op = op3(enc);
- return std_constraint_impl.the_impl().part_depends_on(op, constr_obj,
- which_obj, which_part, nth_child, orient);
- }
-
- //had:
- //* @exception bad_value if one of the parameters has an unrecognized value
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Extract the set of objects/parts that a constraint depends on. This
- * produces a Vector with pairs of entries, the first being an interactor,
- * and the second being an Integer which is the part number of that
- * interactor that is depended upon.<p>
- *
- * Here we assume that this is a 3 operand constraint.<p>
- *
- * @param int enc encoding value for the constraint in question.
- * @param interactor constr_obj the object the constraint is attached to
- * (hence its referents are relative to).
- * @param int orient Orientation of the constraint. This
- * should be HORIZONTAL or VERTICAL.
- * @return Vector containing pairs of objects, the first being an interactor
- * which is depended upon, and the second being an Integer
- * giving the part number of the part depended upon.
- */
- public static Vector mk_depend_list(int enc, interactor constr_obj,int orient)
- {
- int op;
- Vector result;
-
- /* do implicit operands first */
- result = mk_implicit_depend_list(enc, constr_obj, orient);
-
- /* extract the first operand and process that */
- op = op1(enc);
- std_constraint_impl.the_impl().
- add_depend_obj_part(result, op, constr_obj, orient);
-
- /* and the second */
- op = op2(enc);
- std_constraint_impl.the_impl().
- add_depend_obj_part(result, op, constr_obj, orient);
-
- /* and the third */
- op = op3(enc);
- std_constraint_impl.the_impl().
- add_depend_obj_part(result, op, constr_obj, orient);
-
- return result;
- }
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
-
- /**
- * Extract the set of objects/parts that a particular constraint function
- * implicitly depends on. This produces a Vector with pairs of entries, the
- * first being an interactor, and the second being an Integer which is the
- * part number of that interactor that is depended upon.<p>
- *
- * @param int enc encoding value for the constraint in question.
- * @param interactor constr_obj the object the constraint is attached to
- * (hence its referents are relative to).
- * @param int orient Orientation of the constraint. This
- * should be HORIZONTAL or VERTICAL.
- * @return Vector containing pairs of objects, the first being an interactor
- * which is depended upon, and the second being an Integer
- * giving the part number of the part depended upon.
- */
- public static Vector mk_implicit_depend_list(
- int enc, interactor constr_obj,int orient)
- {
- int op;
- Vector result = new Vector(9);
-
- /* no implicits at this point */
-
- return result;
- }
-
- /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */
- }
-
- /*=========================== COPYRIGHT NOTICE ===========================
-
- This file is part of the subArctic user interface toolkit.
-
- Copyright (c) 1996 Scott Hudson and Ian Smith
- All rights reserved.
-
- The subArctic system is freely available for most uses under the terms
- and conditions described in
- http://www.cc.gatech.edu/gvu/ui/sub_arctic/sub_arctic/doc/usage.html
- and appearing in full in the lib/interactor.java source file.
-
- The current release and additional information about this software can be
- found starting at: http://www.cc.gatech.edu/gvu/ui/sub_arctic/
-
- ========================================================================*/
-